package com.ds.common.org.expression.person;

import com.ds.common.expression.ParseException;
import com.ds.common.expression.function.Function;
import com.ds.org.OrgManager;
import com.ds.org.Person;
import com.ds.org.Role;
import com.ds.server.OrgManagerFactory;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
import java.util.StringTokenizer;

/**
 * 取得指定某些角色下的所有人员，已包含人员去重功能。
 * <p>Title: JDSORG组织机构中间件</p>
 * <p>Description: </p>
 * <p>Copyright: jds Copyright (c) 2003-2008</p>
 * <p>Company: www.justdos.net</p>
 *
 * @author wenzhangli
 * @version 2.0
 */
public class GetPersonByPersonRoles extends Function {
    public GetPersonByPersonRoles() {
        numberOfParameters = 1;
    }

    public void run(Stack stack) throws ParseException {
        checkStack(stack); // check the stack

        Object param2 = stack.pop();
        stack.push(perform(param2));
    }

    protected Person[] perform(Object param1) throws ParseException {
        if (param1 == null) {
            return new Person[0];
        }
        //String，“:”隔开
        if (param1 instanceof String) {
            OrgManager orgManager = OrgManagerFactory.getOrgManager();
            String roleNames = (String) param1;
            StringTokenizer st = new StringTokenizer(roleNames, ":");
            List result = new ArrayList();
            while (st.hasMoreTokens()) {
                Person[] persons = (Person[]) orgManager.getPersonsByPersonRoleName(st.nextToken()).toArray(new Person[0]);
                for (int i = 0; i < persons.length; i++) {
                    if (!result.contains(persons[i])) {
                        result.add(persons[i]);
                    }
                }
            }
            return (Person[]) result.toArray(new Person[result.size()]);
        }

        //PersonRole数组
        if (param1 instanceof Role[]) {
            OrgManager orgManager = OrgManagerFactory.getOrgManager();
            Role[] roles = (Role[]) param1;
            List result = new ArrayList();
            for (int i = 0, m = roles.length; i < m; i++) {
                String roleId = roles[i].getRoleId();

                List<Person> persons = orgManager.getPersonsByPersonRoleID(roleId);
                for (Person person : persons) {
                    if (!result.contains(person)) {
                        result.add(person);
                    }
                }
            }
            return (Person[]) result.toArray(new Person[result.size()]);
        }

        throw new ParseException("Invalid parameter type in:" + this.getClass().getName() + ", param1 is " + param1.getClass().getName());
    }
}
